package uoc.biblioteca.export;



   /**
    * Licensed under the Artistic License; you may not use this file
    * except in compliance with the License.
    * You may obtain a copy of the License at
    *
    *      http://displaytag.sourceforge.net/license.html
    *
    * THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
    * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   */

  
import java.io.IOException;
import java.io.Writer;
import java.util.Iterator;
 
import javax.servlet.jsp.JspException;
  
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.displaytag.export.TextExportView;
import org.displaytag.model.Column;
import org.displaytag.model.ColumnIterator;
import org.displaytag.model.HeaderCell;
import org.displaytag.model.Row;
import org.displaytag.model.RowIterator;
import org.displaytag.model.TableModel;
 
  
  /**
   * <p>
   * Base abstract class for simple export views.
   * </p>
   * <p>
   * A class that extends BaseExportView simply need to provide delimiters for rows and columns.
   * </p>
   * @author Fabrizio Giustina
   * @version $Revision: 1081 $ ($Author: fgiust $)
   */
  public abstract class BaseExportView implements TextExportView
  {
  
      /**
       * logger.
       */
      private static Log log = LogFactory.getLog(BaseExportView.class);
  
      /**
       * TableModel to render.
       */
      private TableModel model;
  
      /**
       * export full list?
       */
      private boolean exportFull;
  
      /**
       * include header in export?
       */
      private boolean header;
  
      /**
       * decorate export?
       */
      private boolean decorated;
  
      /**
       * @see org.displaytag.export.ExportView#setParameters(org.displaytag.model.TableModel, boolean, boolean, boolean)
       */
      public void setParameters(TableModel tableModel, boolean exportFullList, boolean includeHeader,
          boolean decorateValues)
      {
          this.model = tableModel;
          this.exportFull = exportFullList;
          this.header = includeHeader;
          this.decorated = decorateValues;
      }
  
      /**
       * String to add before a row.
       * @return String
       */
      protected String getRowStart()
      {
          return null;
      }
  
      /**
       * String to add after a row.
       * @return String
       */
      protected String getRowEnd()
      {
          return null;
      }
  
      /**
      * String to add before a cell.
      * @return String
      */
     protected String getCellStart()
     {
         return null;
     }
 
     /**
      * String to add after a cell.
      * @return String
      */
     protected abstract String getCellEnd();
 
     /**
      * String to add to the top of document.
      * @return String
      */
     protected String getDocumentStart()
     {
         return null;
     }
 
     /**
      * String to add to the end of document.
      * @return String
      */
     protected String getDocumentEnd()
     {
         return null;
     }
 
     /**
      * always append cell end string?
      * @return boolean
      */
     protected abstract boolean getAlwaysAppendCellEnd();
 
     /**
      * always append row end string?
      * @return boolean
      */
     protected abstract boolean getAlwaysAppendRowEnd();
 
     /**
      * can be implemented to escape values for different output.
      * @param value original column value
      * @return escaped column value
      */
     protected abstract String escapeColumnValue(Object value);
 
     /**
      * Write table header.
      * @return String rendered header
      */
     protected String doHeaders()
     {
 
         final String ROW_START = getRowStart();
         final String ROW_END = getRowEnd();
         final String CELL_START = getCellStart();
         final String CELL_END = getCellEnd();
         final boolean ALWAYS_APPEND_CELL_END = getAlwaysAppendCellEnd();
 
         StringBuffer buffer = new StringBuffer(1000);
 
         Iterator iterator = this.model.getHeaderCellList().iterator();
 
         // start row
         if (ROW_START != null)
         {
             buffer.append(ROW_START);
         }
 
         while (iterator.hasNext())
         {
             HeaderCell headerCell = (HeaderCell) iterator.next();
 
             String columnHeader = headerCell.getTitle();
 
             if (columnHeader == null)
             {
                 columnHeader = StringUtils.capitalize(headerCell.getBeanPropertyName());
             }
 
             columnHeader = escapeColumnValue(columnHeader);
 
             if (CELL_START != null)
             {
                 buffer.append(CELL_START);
             }
 
             if (columnHeader != null)
             {
                 buffer.append(columnHeader);
             }
 
             if (CELL_END != null && (ALWAYS_APPEND_CELL_END || iterator.hasNext()))
             {
                 buffer.append(CELL_END);
             }
         }
 
         // end row
         if (ROW_END != null)
         {
             buffer.append(ROW_END);
         }
 
         return buffer.toString();
 
     }
 
     /**
      * @see org.displaytag.export.TextExportView#doExport(java.io.Writer)
      */
     public void doExport(Writer out) throws IOException, JspException
     {
         if (log.isDebugEnabled())
         {
             log.debug(getClass().getName());
         }
 
         final String DOCUMENT_START = getDocumentStart();
         final String DOCUMENT_END = getDocumentEnd();
         final String ROW_START = getRowStart();
         final String ROW_END = getRowEnd();
         final String CELL_START = getCellStart();
         final String CELL_END = getCellEnd();
         final boolean ALWAYS_APPEND_CELL_END = getAlwaysAppendCellEnd();
         final boolean ALWAYS_APPEND_ROW_END = getAlwaysAppendRowEnd();
 
         // document start
         write(out, DOCUMENT_START);
 
         if (this.header)
         {
             write(out, doHeaders());
         }
 
         // get the correct iterator (full or partial list according to the exportFull field)
         RowIterator rowIterator = this.model.getRowIterator(this.exportFull);
 
         // iterator on rows
         while (rowIterator.hasNext())
         {
             Row row = rowIterator.next();
 
             if (this.model.getTableDecorator() != null)
             {
 
                 String stringStartRow = this.model.getTableDecorator().startRow();
                 write(out, stringStartRow);
             }
 
             // iterator on columns
             ColumnIterator columnIterator = row.getColumnIterator(this.model.getHeaderCellList());
 
             write(out, ROW_START);
 
             while (columnIterator.hasNext())
             {
                 Column column = columnIterator.nextColumn();
 
                 // Get the value to be displayed for the column
                 String value = escapeColumnValue(column.getValue(this.decorated));
 
                 write(out, CELL_START);
 
                 write(out, value);
 
                 if (ALWAYS_APPEND_CELL_END || columnIterator.hasNext())
                 {
                     write(out, CELL_END);
                 }
 
             }
             if (ALWAYS_APPEND_ROW_END || rowIterator.hasNext())
             {
                 write(out, ROW_END);
             }
         }
 
         // document end
         write(out, DOCUMENT_END);
 
     }
 
     /**
      * Write a String, checking for nulls value.
      * @param out output writer
      * @param string String to be written
      * @throws IOException thrown by out.write
      */
     private void write(Writer out, String string) throws IOException
     {
         if (string != null)
         {
             out.write(string);
         }
     }
 
     /**
      * @see org.displaytag.export.TextExportView#outputPage()
      */
     public boolean outputPage()
     {
         return false;
     }
 }


